/*
 * Copyright 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <EGL/egl.h>
#include "gl3stub.h"

GLboolean gl3stubInit() {
#define FIND_PROC(s) s = (decltype(s)) eglGetProcAddress(#s);
  FIND_PROC(glReadBuffer);
  FIND_PROC(glDrawRangeElements);
  FIND_PROC(glTexImage3D);
  FIND_PROC(glTexSubImage3D);
  FIND_PROC(glCopyTexSubImage3D);
  FIND_PROC(glCompressedTexImage3D);
  FIND_PROC(glCompressedTexSubImage3D);
  FIND_PROC(glGenQueries);
  FIND_PROC(glDeleteQueries);
  FIND_PROC(glIsQuery);
  FIND_PROC(glBeginQuery);
  FIND_PROC(glEndQuery);
  FIND_PROC(glGetQueryiv);
  FIND_PROC(glGetQueryObjectuiv);
  FIND_PROC(glUnmapBuffer);
  FIND_PROC(glGetBufferPointerv);
  FIND_PROC(glDrawBuffers);
  FIND_PROC(glUniformMatrix2x3fv);
  FIND_PROC(glUniformMatrix3x2fv);
  FIND_PROC(glUniformMatrix2x4fv);
  FIND_PROC(glUniformMatrix4x2fv);
  FIND_PROC(glUniformMatrix3x4fv);
  FIND_PROC(glUniformMatrix4x3fv);
  FIND_PROC(glBlitFramebuffer);
  FIND_PROC(glRenderbufferStorageMultisample);
  FIND_PROC(glFramebufferTextureLayer);
  FIND_PROC(glMapBufferRange);
  FIND_PROC(glFlushMappedBufferRange);
  FIND_PROC(glBindVertexArray);
  FIND_PROC(glDeleteVertexArrays);
  FIND_PROC(glGenVertexArrays);
  FIND_PROC(glIsVertexArray);
  FIND_PROC(glGetIntegeri_v);
  FIND_PROC(glBeginTransformFeedback);
  FIND_PROC(glEndTransformFeedback);
  FIND_PROC(glBindBufferRange);
  FIND_PROC(glBindBufferBase);
  FIND_PROC(glTransformFeedbackVaryings);
  FIND_PROC(glGetTransformFeedbackVarying);
  FIND_PROC(glVertexAttribIPointer);
  FIND_PROC(glGetVertexAttribIiv);
  FIND_PROC(glGetVertexAttribIuiv);
  FIND_PROC(glVertexAttribI4i);
  FIND_PROC(glVertexAttribI4ui);
  FIND_PROC(glVertexAttribI4iv);
  FIND_PROC(glVertexAttribI4uiv);
  FIND_PROC(glGetUniformuiv);
  FIND_PROC(glGetFragDataLocation);
  FIND_PROC(glUniform1ui);
  FIND_PROC(glUniform2ui);
  FIND_PROC(glUniform3ui);
  FIND_PROC(glUniform4ui);
  FIND_PROC(glUniform1uiv);
  FIND_PROC(glUniform2uiv);
  FIND_PROC(glUniform3uiv);
  FIND_PROC(glUniform4uiv);
  FIND_PROC(glClearBufferiv);
  FIND_PROC(glClearBufferuiv);
  FIND_PROC(glClearBufferfv);
  FIND_PROC(glClearBufferfi);
  FIND_PROC(glGetStringi);
  FIND_PROC(glCopyBufferSubData);
  FIND_PROC(glGetUniformIndices);
  FIND_PROC(glGetActiveUniformsiv);
  FIND_PROC(glGetUniformBlockIndex);
  FIND_PROC(glGetActiveUniformBlockiv);
  FIND_PROC(glGetActiveUniformBlockName);
  FIND_PROC(glUniformBlockBinding);
  FIND_PROC(glDrawArraysInstanced);
  FIND_PROC(glDrawElementsInstanced);
  FIND_PROC(glFenceSync);
  FIND_PROC(glIsSync);
  FIND_PROC(glDeleteSync);
  FIND_PROC(glClientWaitSync);
  FIND_PROC(glWaitSync);
  FIND_PROC(glGetInteger64v);
  FIND_PROC(glGetSynciv);
  FIND_PROC(glGetInteger64i_v);
  FIND_PROC(glGetBufferParameteri64v);
  FIND_PROC(glGenSamplers);
  FIND_PROC(glDeleteSamplers);
  FIND_PROC(glIsSampler);
  FIND_PROC(glBindSampler);
  FIND_PROC(glSamplerParameteri);
  FIND_PROC(glSamplerParameteriv);
  FIND_PROC(glSamplerParameterf);
  FIND_PROC(glSamplerParameterfv);
  FIND_PROC(glGetSamplerParameteriv);
  FIND_PROC(glGetSamplerParameterfv);
  FIND_PROC(glVertexAttribDivisor);
  FIND_PROC(glBindTransformFeedback);
  FIND_PROC(glDeleteTransformFeedbacks);
  FIND_PROC(glGenTransformFeedbacks);
  FIND_PROC(glIsTransformFeedback);
  FIND_PROC(glPauseTransformFeedback);
  FIND_PROC(glResumeTransformFeedback);
  FIND_PROC(glGetProgramBinary);
  FIND_PROC(glProgramBinary);
  FIND_PROC(glProgramParameteri);
  FIND_PROC(glInvalidateFramebuffer);
  FIND_PROC(glInvalidateSubFramebuffer);
  FIND_PROC(glTexStorage2D);
  FIND_PROC(glTexStorage3D);
  FIND_PROC(glGetInternalformativ);
#undef FIND_PROC

  if (!glReadBuffer || !glDrawRangeElements || !glTexImage3D ||
      !glTexSubImage3D || !glCopyTexSubImage3D || !glCompressedTexImage3D ||
      !glCompressedTexSubImage3D || !glGenQueries || !glDeleteQueries ||
      !glIsQuery || !glBeginQuery || !glEndQuery || !glGetQueryiv ||
      !glGetQueryObjectuiv || !glUnmapBuffer || !glGetBufferPointerv ||
      !glDrawBuffers || !glUniformMatrix2x3fv || !glUniformMatrix3x2fv ||
      !glUniformMatrix2x4fv || !glUniformMatrix4x2fv || !glUniformMatrix3x4fv ||
      !glUniformMatrix4x3fv || !glBlitFramebuffer ||
      !glRenderbufferStorageMultisample || !glFramebufferTextureLayer ||
      !glMapBufferRange || !glFlushMappedBufferRange || !glBindVertexArray ||
      !glDeleteVertexArrays || !glGenVertexArrays || !glIsVertexArray ||
      !glGetIntegeri_v || !glBeginTransformFeedback ||
      !glEndTransformFeedback || !glBindBufferRange || !glBindBufferBase ||
      !glTransformFeedbackVaryings || !glGetTransformFeedbackVarying ||
      !glVertexAttribIPointer || !glGetVertexAttribIiv ||
      !glGetVertexAttribIuiv || !glVertexAttribI4i || !glVertexAttribI4ui ||
      !glVertexAttribI4iv || !glVertexAttribI4uiv || !glGetUniformuiv ||
      !glGetFragDataLocation || !glUniform1ui || !glUniform2ui ||
      !glUniform3ui || !glUniform4ui || !glUniform1uiv || !glUniform2uiv ||
      !glUniform3uiv || !glUniform4uiv || !glClearBufferiv ||
      !glClearBufferuiv || !glClearBufferfv || !glClearBufferfi ||
      !glGetStringi || !glCopyBufferSubData || !glGetUniformIndices ||
      !glGetActiveUniformsiv || !glGetUniformBlockIndex ||
      !glGetActiveUniformBlockiv || !glGetActiveUniformBlockName ||
      !glUniformBlockBinding || !glDrawArraysInstanced ||
      !glDrawElementsInstanced || !glFenceSync || !glIsSync || !glDeleteSync ||
      !glClientWaitSync || !glWaitSync || !glGetInteger64v || !glGetSynciv ||
      !glGetInteger64i_v || !glGetBufferParameteri64v || !glGenSamplers ||
      !glDeleteSamplers || !glIsSampler || !glBindSampler ||
      !glSamplerParameteri || !glSamplerParameteriv || !glSamplerParameterf ||
      !glSamplerParameterfv || !glGetSamplerParameteriv ||
      !glGetSamplerParameterfv || !glVertexAttribDivisor ||
      !glBindTransformFeedback || !glDeleteTransformFeedbacks ||
      !glGenTransformFeedbacks || !glIsTransformFeedback ||
      !glPauseTransformFeedback || !glResumeTransformFeedback ||
      !glGetProgramBinary || !glProgramBinary || !glProgramParameteri ||
      !glInvalidateFramebuffer || !glInvalidateSubFramebuffer ||
      !glTexStorage2D || !glTexStorage3D || !glGetInternalformativ) {
    return GL_FALSE;
  }

  return GL_TRUE;
}

/* Function pointer definitions */ GL_APICALL void (*GL_APIENTRY glReadBuffer)(
    GLenum mode);
GL_APICALL void (*GL_APIENTRY glDrawRangeElements)(GLenum mode, GLuint start,
                                                   GLuint end, GLsizei count,
                                                   GLenum type,
                                                   const GLvoid *indices);
GL_APICALL void (*GL_APIENTRY glTexImage3D)(GLenum target, GLint level,
                                            GLint internalformat, GLsizei width,
                                            GLsizei height, GLsizei depth,
                                            GLint border, GLenum format,
                                            GLenum type, const GLvoid *pixels);
GL_APICALL void (*GL_APIENTRY glTexSubImage3D)(GLenum target, GLint level,
                                               GLint xoffset, GLint yoffset,
                                               GLint zoffset, GLsizei width,
                                               GLsizei height, GLsizei depth,
                                               GLenum format, GLenum type,
                                               const GLvoid *pixels);
GL_APICALL void (*GL_APIENTRY glCopyTexSubImage3D)(GLenum target, GLint level,
                                                   GLint xoffset, GLint yoffset,
                                                   GLint zoffset, GLint x,
                                                   GLint y, GLsizei width,
                                                   GLsizei height);
GL_APICALL void (*GL_APIENTRY glCompressedTexImage3D)(
    GLenum target, GLint level, GLenum internalformat, GLsizei width,
    GLsizei height, GLsizei depth, GLint border, GLsizei imageSize,
    const GLvoid *data);
GL_APICALL void (*GL_APIENTRY glCompressedTexSubImage3D)(
    GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
    GLsizei width, GLsizei height, GLsizei depth, GLenum format,
    GLsizei imageSize, const GLvoid *data);
GL_APICALL void (*GL_APIENTRY glGenQueries)(GLsizei n, GLuint *ids);
GL_APICALL void (*GL_APIENTRY glDeleteQueries)(GLsizei n, const GLuint *ids);
GL_APICALL GLboolean (*GL_APIENTRY glIsQuery)(GLuint id);
GL_APICALL void (*GL_APIENTRY glBeginQuery)(GLenum target, GLuint id);
GL_APICALL void (*GL_APIENTRY glEndQuery)(GLenum target);
GL_APICALL void (*GL_APIENTRY glGetQueryiv)(GLenum target, GLenum pname,
                                            GLint *params);
GL_APICALL void (*GL_APIENTRY glGetQueryObjectuiv)(GLuint id, GLenum pname,
                                                   GLuint *params);
GL_APICALL GLboolean (*GL_APIENTRY glUnmapBuffer)(GLenum target);
GL_APICALL void (*GL_APIENTRY glGetBufferPointerv)(GLenum target, GLenum pname,
                                                   GLvoid **params);
GL_APICALL void (*GL_APIENTRY glDrawBuffers)(GLsizei n, const GLenum *bufs);
GL_APICALL void (*GL_APIENTRY glUniformMatrix2x3fv)(GLint location,
                                                    GLsizei count,
                                                    GLboolean transpose,
                                                    const GLfloat *value);
GL_APICALL void (*GL_APIENTRY glUniformMatrix3x2fv)(GLint location,
                                                    GLsizei count,
                                                    GLboolean transpose,
                                                    const GLfloat *value);
GL_APICALL void (*GL_APIENTRY glUniformMatrix2x4fv)(GLint location,
                                                    GLsizei count,
                                                    GLboolean transpose,
                                                    const GLfloat *value);
GL_APICALL void (*GL_APIENTRY glUniformMatrix4x2fv)(GLint location,
                                                    GLsizei count,
                                                    GLboolean transpose,
                                                    const GLfloat *value);
GL_APICALL void (*GL_APIENTRY glUniformMatrix3x4fv)(GLint location,
                                                    GLsizei count,
                                                    GLboolean transpose,
                                                    const GLfloat *value);
GL_APICALL void (*GL_APIENTRY glUniformMatrix4x3fv)(GLint location,
                                                    GLsizei count,
                                                    GLboolean transpose,
                                                    const GLfloat *value);
GL_APICALL void (*GL_APIENTRY glBlitFramebuffer)(
    GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0,
    GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
GL_APICALL void (*GL_APIENTRY glRenderbufferStorageMultisample)(
    GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,
    GLsizei height);
GL_APICALL void (*GL_APIENTRY glFramebufferTextureLayer)(
    GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
GL_APICALL GLvoid *(*GL_APIENTRY glMapBufferRange)(GLenum target,
                                                   GLintptr offset,
                                                   GLsizeiptr length,
                                                   GLbitfield access);
GL_APICALL void (*GL_APIENTRY glFlushMappedBufferRange)(GLenum target,
                                                        GLintptr offset,
                                                        GLsizeiptr length);
GL_APICALL void (*GL_APIENTRY glBindVertexArray)(GLuint array);
GL_APICALL void (*GL_APIENTRY glDeleteVertexArrays)(GLsizei n,
                                                    const GLuint *arrays);
GL_APICALL void (*GL_APIENTRY glGenVertexArrays)(GLsizei n, GLuint *arrays);
GL_APICALL GLboolean (*GL_APIENTRY glIsVertexArray)(GLuint array);
GL_APICALL void (*GL_APIENTRY glGetIntegeri_v)(GLenum target, GLuint index,
                                               GLint *data);
GL_APICALL void (*GL_APIENTRY glBeginTransformFeedback)(GLenum primitiveMode);
GL_APICALL void (*GL_APIENTRY glEndTransformFeedback)(void);
GL_APICALL void (*GL_APIENTRY glBindBufferRange)(GLenum target, GLuint index,
                                                 GLuint buffer, GLintptr offset,
                                                 GLsizeiptr size);
GL_APICALL void (*GL_APIENTRY glBindBufferBase)(GLenum target, GLuint index,
                                                GLuint buffer);
GL_APICALL void (*GL_APIENTRY glTransformFeedbackVaryings)(
    GLuint program, GLsizei count, const GLchar *const *varyings,
    GLenum bufferMode);
GL_APICALL void (*GL_APIENTRY glGetTransformFeedbackVarying)(
    GLuint program, GLuint index, GLsizei bufSize, GLsizei *length,
    GLsizei *size, GLenum *type, GLchar *name);
GL_APICALL void (*GL_APIENTRY glVertexAttribIPointer)(GLuint index, GLint size,
                                                      GLenum type,
                                                      GLsizei stride,
                                                      const GLvoid *pointer);
GL_APICALL void (*GL_APIENTRY glGetVertexAttribIiv)(GLuint index, GLenum pname,
                                                    GLint *params);
GL_APICALL void (*GL_APIENTRY glGetVertexAttribIuiv)(GLuint index, GLenum pname,
                                                     GLuint *params);
GL_APICALL void (*GL_APIENTRY glVertexAttribI4i)(GLuint index, GLint x, GLint y,
                                                 GLint z, GLint w);
GL_APICALL void (*GL_APIENTRY glVertexAttribI4ui)(GLuint index, GLuint x,
                                                  GLuint y, GLuint z, GLuint w);
GL_APICALL void (*GL_APIENTRY glVertexAttribI4iv)(GLuint index, const GLint *v);
GL_APICALL void (*GL_APIENTRY glVertexAttribI4uiv)(GLuint index,
                                                   const GLuint *v);
GL_APICALL void (*GL_APIENTRY glGetUniformuiv)(GLuint program, GLint location,
                                               GLuint *params);
GL_APICALL GLint (*GL_APIENTRY glGetFragDataLocation)(GLuint program,
                                                      const GLchar *name);
GL_APICALL void (*GL_APIENTRY glUniform1ui)(GLint location, GLuint v0);
GL_APICALL void (*GL_APIENTRY glUniform2ui)(GLint location, GLuint v0,
                                            GLuint v1);
GL_APICALL void (*GL_APIENTRY glUniform3ui)(GLint location, GLuint v0,
                                            GLuint v1, GLuint v2);
GL_APICALL void (*GL_APIENTRY glUniform4ui)(GLint location, GLuint v0,
                                            GLuint v1, GLuint v2, GLuint v3);
GL_APICALL void (*GL_APIENTRY glUniform1uiv)(GLint location, GLsizei count,
                                             const GLuint *value);
GL_APICALL void (*GL_APIENTRY glUniform2uiv)(GLint location, GLsizei count,
                                             const GLuint *value);
GL_APICALL void (*GL_APIENTRY glUniform3uiv)(GLint location, GLsizei count,
                                             const GLuint *value);
GL_APICALL void (*GL_APIENTRY glUniform4uiv)(GLint location, GLsizei count,
                                             const GLuint *value);
GL_APICALL void (*GL_APIENTRY glClearBufferiv)(GLenum buffer, GLint drawbuffer,
                                               const GLint *value);
GL_APICALL void (*GL_APIENTRY glClearBufferuiv)(GLenum buffer, GLint drawbuffer,
                                                const GLuint *value);
GL_APICALL void (*GL_APIENTRY glClearBufferfv)(GLenum buffer, GLint drawbuffer,
                                               const GLfloat *value);
GL_APICALL void (*GL_APIENTRY glClearBufferfi)(GLenum buffer, GLint drawbuffer,
                                               GLfloat depth, GLint stencil);
GL_APICALL const GLubyte *(*GL_APIENTRY glGetStringi)(GLenum name,
                                                      GLuint index);
GL_APICALL void (*GL_APIENTRY glCopyBufferSubData)(GLenum readTarget,
                                                   GLenum writeTarget,
                                                   GLintptr readOffset,
                                                   GLintptr writeOffset,
                                                   GLsizeiptr size);
GL_APICALL void (*GL_APIENTRY glGetUniformIndices)(
    GLuint program, GLsizei uniformCount, const GLchar *const *uniformNames,
    GLuint *uniformIndices);
GL_APICALL void (*GL_APIENTRY glGetActiveUniformsiv)(
    GLuint program, GLsizei uniformCount, const GLuint *uniformIndices,
    GLenum pname, GLint *params);
GL_APICALL GLuint (*GL_APIENTRY glGetUniformBlockIndex)(
    GLuint program, const GLchar *uniformBlockName);
GL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockiv)(
    GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
GL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockName)(
    GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length,
    GLchar *uniformBlockName);
GL_APICALL void (*GL_APIENTRY glUniformBlockBinding)(
    GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
GL_APICALL void (*GL_APIENTRY glDrawArraysInstanced)(GLenum mode, GLint first,
                                                     GLsizei count,
                                                     GLsizei instanceCount);
GL_APICALL void (*GL_APIENTRY glDrawElementsInstanced)(GLenum mode,
                                                       GLsizei count,
                                                       GLenum type,
                                                       const GLvoid *indices,
                                                       GLsizei instanceCount);
GL_APICALL GLsync (*GL_APIENTRY glFenceSync)(GLenum condition,
                                             GLbitfield flags);
GL_APICALL GLboolean (*GL_APIENTRY glIsSync)(GLsync sync);
GL_APICALL void (*GL_APIENTRY glDeleteSync)(GLsync sync);
GL_APICALL GLenum (*GL_APIENTRY glClientWaitSync)(GLsync sync, GLbitfield flags,
                                                  GLuint64 timeout);
GL_APICALL void (*GL_APIENTRY glWaitSync)(GLsync sync, GLbitfield flags,
                                          GLuint64 timeout);
GL_APICALL void (*GL_APIENTRY glGetInteger64v)(GLenum pname, GLint64 *params);
GL_APICALL void (*GL_APIENTRY glGetSynciv)(GLsync sync, GLenum pname,
                                           GLsizei bufSize, GLsizei *length,
                                           GLint *values);
GL_APICALL void (*GL_APIENTRY glGetInteger64i_v)(GLenum target, GLuint index,
                                                 GLint64 *data);
GL_APICALL void (*GL_APIENTRY glGetBufferParameteri64v)(GLenum target,
                                                        GLenum pname,
                                                        GLint64 *params);
GL_APICALL void (*GL_APIENTRY glGenSamplers)(GLsizei count, GLuint *samplers);
GL_APICALL void (*GL_APIENTRY glDeleteSamplers)(GLsizei count,
                                                const GLuint *samplers);
GL_APICALL GLboolean (*GL_APIENTRY glIsSampler)(GLuint sampler);
GL_APICALL void (*GL_APIENTRY glBindSampler)(GLuint unit, GLuint sampler);
GL_APICALL void (*GL_APIENTRY glSamplerParameteri)(GLuint sampler, GLenum pname,
                                                   GLint param);
GL_APICALL void (*GL_APIENTRY glSamplerParameteriv)(GLuint sampler,
                                                    GLenum pname,
                                                    const GLint *param);
GL_APICALL void (*GL_APIENTRY glSamplerParameterf)(GLuint sampler, GLenum pname,
                                                   GLfloat param);
GL_APICALL void (*GL_APIENTRY glSamplerParameterfv)(GLuint sampler,
                                                    GLenum pname,
                                                    const GLfloat *param);
GL_APICALL void (*GL_APIENTRY glGetSamplerParameteriv)(GLuint sampler,
                                                       GLenum pname,
                                                       GLint *params);
GL_APICALL void (*GL_APIENTRY glGetSamplerParameterfv)(GLuint sampler,
                                                       GLenum pname,
                                                       GLfloat *params);
GL_APICALL void (*GL_APIENTRY glVertexAttribDivisor)(GLuint index,
                                                     GLuint divisor);
GL_APICALL void (*GL_APIENTRY glBindTransformFeedback)(GLenum target,
                                                       GLuint id);
GL_APICALL void (*GL_APIENTRY glDeleteTransformFeedbacks)(GLsizei n,
                                                          const GLuint *ids);
GL_APICALL void (*GL_APIENTRY glGenTransformFeedbacks)(GLsizei n, GLuint *ids);
GL_APICALL GLboolean (*GL_APIENTRY glIsTransformFeedback)(GLuint id);
GL_APICALL void (*GL_APIENTRY glPauseTransformFeedback)(void);
GL_APICALL void (*GL_APIENTRY glResumeTransformFeedback)(void);
GL_APICALL void (*GL_APIENTRY glGetProgramBinary)(GLuint program,
                                                  GLsizei bufSize,
                                                  GLsizei *length,
                                                  GLenum *binaryFormat,
                                                  GLvoid *binary);
GL_APICALL void (*GL_APIENTRY glProgramBinary)(GLuint program,
                                               GLenum binaryFormat,
                                               const GLvoid *binary,
                                               GLsizei length);
GL_APICALL void (*GL_APIENTRY glProgramParameteri)(GLuint program, GLenum pname,
                                                   GLint value);
GL_APICALL void (*GL_APIENTRY glInvalidateFramebuffer)(
    GLenum target, GLsizei numAttachments, const GLenum *attachments);
GL_APICALL void (*GL_APIENTRY glInvalidateSubFramebuffer)(
    GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x,
    GLint y, GLsizei width, GLsizei height);
GL_APICALL void (*GL_APIENTRY glTexStorage2D)(GLenum target, GLsizei levels,
                                              GLenum internalformat,
                                              GLsizei width, GLsizei height);
GL_APICALL void (*GL_APIENTRY glTexStorage3D)(GLenum target, GLsizei levels,
                                              GLenum internalformat,
                                              GLsizei width, GLsizei height,
                                              GLsizei depth);
GL_APICALL void (*GL_APIENTRY glGetInternalformativ)(GLenum target,
                                                     GLenum internalformat,
                                                     GLenum pname,
                                                     GLsizei bufSize,
                                                     GLint *params);
